#include<iostream>
#include<unistd.h>
#include<cstdlib>
#include<string>
#include<string.h>
#include<errno.h>
#include<vector>
#include<sys/types.h>
#include<sys/wait.h>
#include<functional>
#include"task.h"

using task_t = std::function<void()>;


// 非阻塞等待

void LoadTask(std::vector<task_t> &tasks)
{
    tasks.push_back(PrintLog);
    tasks.push_back(Download);
    tasks.push_back(BackUp);
}
int main()
{
    std::vector<task_t> tasks;
    LoadTask(tasks);

    pid_t id = fork();
    if(id == 0)  // child
    {
        while(1)
        {
            printf("我是子进程，pid: %d\n",getpid());
            sleep(1);
        }
        exit(0);
    }

    // father
    while(1)
    {
        pid_t rid = waitpid(id,nullptr,WNOHANG);
        if(rid > 0)
        {
            printf("等待子进程%d成功\n",rid);
            sleep(1);
            break;
        }
        else if(rid < 0)
        {
            printf("等待子进程失败\n");
            sleep(1);
            break;
        }
        else
        {
            printf("子进程尚未退出\n");
            sleep(1);

            //阻塞期间父进程做自己的事情
            for(auto &task : tasks)
            {
                task();
            }
        }
    }
    return 0;
}


//int main()
//{
//    pid_t id = fork();
//    if(id < 0)
//    {
//        printf("erron :%d,errstring :%s\n",errno,strerror(errno));
//    }
//    else if(id == 0)
//    {
//        int cnt = 2;
//        while(cnt--)
//        {
//            printf("子进程运行中，pid :%d\n",getpid());
//            sleep(1);
//        }
//        exit(1);
//    }
//    else
//    {
//       // pid_t rid = wait(nullptr);
//        //pid_t rid = waitpid(-1,nullptr,0); // == wait 等待任意进程
//        //pid_t rid = waitpid(id,nullptr,0); //等待指定进程 
//        int status = 0;
//        pid_t rid = waitpid(id,&status,0);
//        if(rid > 0)
//        {
//            //printf("wait sub process success:rid:%d,status code:%d,exit signal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
//            if(WIFEXITED(status))
//            {
//                printf("wait sub process success,rid:%d,status code:%d\n",rid,WEXITSTATUS(status));
//            }
//            else
//            {
//                printf("child process quit error\n");
//            }
//        }
//        else
//        {
//            perror("waitpid error");
//        }
//        while(1)
//        {
//            printf("我是父进程，:pid:%d\n",getpid());
//            sleep(1);
//        }
//    }
//    return 0;
//}
